/* Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * Assignment
 */
'use strict';

angular.module('flowableModeler').controller('FlowableAssignmentCtrl', [ '$scope', '$modal', function($scope, $modal) {

    // Config for the modal window
    var opts = {
        template:  'editor-app/configuration/properties/assignment-popup.html?version=' + Date.now(),
        scope: $scope
    };

    // Open the dialog
    _internalCreateModal(opts, $modal, $scope);
}]);

angular.module('flowableModeler').controller('FlowableAssignmentPopupCtrl',
    [ '$scope', function($scope) {

        // Put json representing assignment on scope
        if ($scope.property.value !== undefined && $scope.property.value !== null && $scope.property.value.assignment !== undefined && $scope.property.value.assignment !== null){
            $scope.assignment = $scope.property.value.assignment;
        } else {
            $scope.assignment = {};
        }

        if ($scope.assignment.candidateUsers == undefined || $scope.assignment.candidateUsers.length == 0){
            $scope.assignment.candidateUsers = [{value: '',name:''}];
        }

//    // Click handler for + button after enum value
//    var userValueIndex = 1;
//    $scope.addCandidateUserValue = function(index) {
//        $scope.assignment.candidateUsers.splice(index + 1, 0, {value: 'value ' + userValueIndex++});
//    };

        // Click handler for - button after enum value
        $scope.removeCandidateUserValue = function(index) {
            $scope.assignment.candidateUsers.splice(index, 1);
            if ($scope.assignment.candidateUsers.length == 0){
                $scope.assignment.candidateUsers = [{value: '',name:''}];
            }
        };

        if ($scope.assignment.candidateGroups == undefined || $scope.assignment.candidateGroups.length == 0){
            $scope.assignment.candidateGroups = [{value: '',name:''}];
        }

//    var groupValueIndex = 1;
//    $scope.addCandidateGroupValue = function(index) {
//        $scope.assignment.candidateGroups.splice(index + 1, 0, {value: 'value ' + groupValueIndex++});
//    };

        // Click handler for - button after enum value
        $scope.removeCandidateGroupValue = function(index) {
            $scope.assignment.candidateGroups.splice(index, 1);
            if ($scope.assignment.candidateGroups.length == 0){
                $scope.assignment.candidateGroups = [{value: '',name:''}];
            }
        };

        $scope.save = function() {

            $scope.property.value = {};
            handleAssignmentInput($scope);
            $scope.property.value.assignment = $scope.assignment;
            console.log($scope.property);
            $scope.updatePropertyInModel($scope.property);
            $scope.close();
        };

        // Close button handler
        $scope.close = function() {
            handleAssignmentInput($scope);
            $scope.property.mode = 'read';
            $scope.$hide();
        };

        var handleAssignmentInput = function($scope) {
            if ($scope.assignment.candidateUsers)
            {
                var emptyUsers = true;
                var toRemoveIndexes = [];
                for (var i = 0; i < $scope.assignment.candidateUsers.length; i++)
                {
                    if ($scope.assignment.candidateUsers[i].value != '')
                    {
                        emptyUsers = false;
                    }
                    else
                    {
                        toRemoveIndexes[toRemoveIndexes.length] = i;
                    }
                }

                for (var i = 0; i < toRemoveIndexes.length; i++)
                {
                    $scope.assignment.candidateUsers.splice(toRemoveIndexes[i], 1);
                }

                if (emptyUsers)
                {
                    $scope.assignment.candidateUsers = undefined;
                }
            }

            if ($scope.assignment.candidateGroups)
            {
                var emptyGroups = true;
                var toRemoveIndexes = [];
                for (var i = 0; i < $scope.assignment.candidateGroups.length; i++)
                {
                    if ($scope.assignment.candidateGroups[i].value != '')
                    {
                        emptyGroups = false;
                    }
                    else
                    {
                        toRemoveIndexes[toRemoveIndexes.length] = i;
                    }
                }

                for (var i = 0; i < toRemoveIndexes.length; i++)
                {
                    $scope.assignment.candidateGroups.splice(toRemoveIndexes[i], 1);
                }

                if (emptyGroups)
                {
                    $scope.assignment.candidateGroups = undefined;
                }
            }
        };
        /*---------------------流程设计器扩展用户与用户组--------------------*/

        //参数初始化
        $scope.gridData = [];//表格数据
        $scope.gridDataName = 'gridData';
        $scope.selectTitle = '选择指定人';
        $scope.columnData = [];//表格列数据
        $scope.columnDataName = 'columnData';
        $scope.selectType = 0;//0-指定人，1-候选人，2-候选组
        $scope.totalServerItems = 0;//表格总条数
        //分页初始化
        $scope.pagingOptions = {
            pageSizes: [10, 20, 30],//page 行数可选值
            pageSize: 10, //每页行数
            currentPage: 1, //当前显示页数
        };
        //Grid 筛选
        $scope.projects = [];
        $scope.selectedProject = -1;

        //异步请求项目列表数据
        $scope.getProjectDataAsync = function(){
            jQuery.ajax({
                method: 'get',
                url: '/system/user/list'
            }).then(function successCallback(response) {
                $scope.projects = response.data;
                if($scope.projects.length > 0){
                    $scope.selectedProject = $scope.projects[0].userId;
                }
                $scope.dataWatch();
            }, function errorCallback(response) {
                // 请求失败执行代码
                console.log("项目列表请求失败！");
            });
        }
        $scope.getProjectDataAsync();
        //数据监视
        $scope.dataWatch = function (){
            //分页数据监视
            $scope.$watch('pagingOptions', function (newValue, oldValue) {
                $scope.getPagedDataAsync($scope.pagingOptions.currentPage, $scope.pagingOptions.pageSize, $scope.selectedProject);
            },true);

            //当切换类型时，初始化当前页
            $scope.$watch('selectType', function (newValue, oldValue) {
                if(newValue != oldValue){
                    $scope.pagingOptions.currentPage = 1;
                    $scope.getPagedDataAsync($scope.pagingOptions.currentPage, $scope.pagingOptions.pageSize, $scope.selectedProject);
                }
            },true);

            //切换平台
            $scope.change = function(x){
                $scope.selectedProject = x;
                $scope.getPagedDataAsync($scope.pagingOptions.currentPage, $scope.pagingOptions.pageSize, $scope.selectedProject);
            };
        };

        //异步请求表格数据
        $scope.getPagedDataAsync = function(pageNum, pageSize, projectId){
            var url;
            if($scope.selectType == 2){//用户组
                url = '/system/role/list';
                $scope.columnData = $scope.groupColumns;
            }else{
                url = '/system/user/list';
                $scope.columnData = $scope.userColumns;
            }
            jQuery.ajax({
                method: 'get',
                url: url,
                params:{
                    'pageNum': pageNum,
                    'pageSize': pageSize,
                    'projectId': projectId
                },
            }).then(function successCallback(response) {
                $scope.gridData = response.data;
                $scope.totalServerItems = response.data.count;
            }, function errorCallback(response) {
                // 请求失败执行代码
                $scope.gridData = [];
                $scope.totalServerItems = 0;
            });
        }
        //表格属性配置
        $scope.gridOptions = {
            data: $scope.gridDataName,
            multiSelect: false,//复式选择框
            enablePaging: true,
            pagingOptions: $scope.pagingOptions,
            totalServerItems: 'totalServerItems',
            i18n:'zh-cn',
            showFooter: true,
            showSelectionCheckbox: false,
            columnDefs : $scope.columnDataName,
            beforeSelectionChange: function (event) {
                var data = event.entity;

                if($scope.selectType == 0){//选指定人
                    event.entity.checked = !event.selected;
                    $scope.assignment.assignee = data.userId;
                    $scope.assignment.assigneeName  = data.userName;
                }else if($scope.selectType == 1){//候选人
                    var obj = {value: data.userId,name:data.userName};
                    if(!array_contain($scope.assignment.candidateUsers, obj.value)){
                        $scope.assignment.candidateUsers.push(obj);
                    }
                }else if($scope.selectType == 2){//候选组
//        		var obj = {value: $scope.getGroupData(event.entity)};
                    var obj = {value: data.guid,name:data.roleName};
                    if(!array_contain($scope.assignment.candidateGroups, obj.value)){
                        $scope.assignment.candidateGroups.push(obj);
                    }
                }
                return true;
            }
        };

//    $scope.getGroupData = function(data){
////    	var prefix = ['${projectId}_','${bankEnterpriseId}_','${coreEnterpriseId}_','${chainEnterpriseId}_'];
////    	var result = prefix[data.enterpriseType] + data.guid;
//    	var result = data.guid;
//    	return result;
//    };

        //选择用户时表头
        $scope.userColumns = [
            {
                field : 'userId',
                type:'number',
                displayName : '用户Id',
                minWidth: 100,
                width : '18%'
            },
            {
                field : 'userName',
                displayName : '用户名',
                minWidth: 100,
                width : '25%'
            },
            {
                field : 'deptId',
                displayName : '部门编号',
                minWidth: 100,
                width : '25%'
            },
            {
                field : 'deptName',
                displayName : '部门名称',
                minWidth: 100,
                width : '25%'
            }
        ];
//    $scope.displayText = function(enterpriseType){
//    	var tmp = '';
//    	switch(enterpriseType){
//    	case 0:
//    		tmp = '运营';
//    		break;
//    	case 1:
//    		tmp = '银行';
//    		break;
//    	case 2:
//    		tmp = '核心';
//    		break;
//    	case 3:
//    		tmp = '链属';
//    		break;
//    	default:
//    		tmp = 'N/A';
//    		break;
//    	}
//    	return tmp;
//    }
        //选择用户组时表头
        $scope.groupColumns = [
            {
                field : 'guid',
                type:'number',
                displayName : '角色Id',
                minWidth: 100,
                width : '50%'
            },
            {
                field : 'roleName',
                displayName : '角色名称',
                minWidth: 100,
                width : '50%'
            }
//        {
//            field : 'type',
//            type:'number',
//            displayName : '角色类型',
//            minWidth: 100,
//            width : '18%',
//            cellTemplate : '<span>{{row.entity.type==1?"公有":"私有"}}</span>'
//        },
//        {
//            field : 'enterpriseType',
//            displayName : '业务类型',
//            minWidth: 100,
//            width : '18%'
//            ,cellTemplate : '<span>{{displayText(row.entity.enterpriseType);}}</span>'
//        }
        ];

        //输入指定人(审批人)
        $scope.changeAssignee =function(){
            $scope.assignment.assignee=$scope.assignment.assigneeName
        }
        //指定人(审批人)
        $scope.selectAssignee = function () {
            $scope.selectType = 0;
            $scope.selectTitle = '选择指定人';
        };

        //候选人
        $scope.selectCandidate = function () {
            $scope.selectType = 1;
            $scope.selectTitle = '选择候选人';
        };

        //候选组
        $scope.selectGroup = function () {
            $scope.selectType = 2;
            $scope.selectTitle = '选择候选组';
        };
}]);
//声明----如果有此 contains 直接用最好
function array_contain(array, obj){//去重
    for (var i = 0; i < array.length; i++){
        if (array[i].value == obj)//如果要求数据类型也一致，这里可使用恒等号===
            return true;
    }
    return false;
}